php ereg漏洞,实验吧 |
您所在的位置:网站首页 › php ereg函数 › php ereg漏洞,实验吧 |
题目:啊拉?又是php审计。已经想吐了。 hint:ereg()函数有漏洞哩;从小老师就说要用科学的方法来算数。 给我们提示:1)ereg()函数漏洞 2)科学计数法 viewsource: if (isset ($_GET['password'])) { if (ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE) { echo ' You password must be alphanumeric ';} else if (strlen($_GET['password']) < 8 && $_GET['password'] > 9999999) { if (strpos ($_GET['password'], '*-*') !== FALSE) { die('Flag: ' . $flag); } else { echo(' *-* have not been found ');} } else { echo ' Invalid password ';} } ?> 要拿到flag,需要做到: 1)ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE不成立 2)strlen($_GET['password']) < 8 && $_GET['password'] > 9999999 3)strpos ($_GET['password'], '*-*') !== FALSE 首先说明:===为完全相等,2=='2' --> true ,2==='2' --> false,即数据类型和值都要相等 !==为完全不等 解决1)用到ereg的漏洞:先满足需要由大小写字母和数组组成,然后%00截断,%00被识别为尾部,对其后面的字符不予理睬。 解决2)科学计数法满足长度和大小,如1e9 解决3)password中含有*-* 构造同时满足以上三个解决方案的password:1e9%00*-* 提交即得flag。 疑问解答:1)1e9%00*-*不是9个字符吗,为什么满足长度小于8? 答:%00是以编码形式存在,在长度判断中占一个长度。 2)为什么1e9%00*-*这个字符串大于9999999 答:在这两个数据的比较中,由于1e9%00*-*为字符串,>号为弱比较,1e9%00*-*取1e9,远大于9999999。 注意,有的博客写的是字符串和整型比较的时候,字符串只取前面的整数部分(意思就是在这里取1),这是有误的,在这种含e的情况下,会判断你是否符合科学计数法,符合的话按照科学计数法进行转换。 另解: 直接使用数组绕过:修改url password[]= 许多的函数不能处理数组。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |